home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Wolfenstein 3D & Blake S… Gold (Companion Edition)
/
Wolfenstein 3D and Blake Stone Aliens of Gold - Companion Edition.iso
/
wolf
/
wolfstuf
/
mapedit.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-08-06
|
31KB
|
1,165 lines
{
MapEdit 4.1 Wolfenstein Map Editor
Copyright (c) 1992 Bill Kirby
}
{$A+,B-,D+,E-,F-,G-,I+,L-,N-,O-,R-,S-,V-,X-}
{$M 16384,0,655360}
program mapedit;
uses crt,dos,graph,mouse;
const MAP_X = 6;
MAP_Y = 6;
TEXTLOC = 460;
GAMEPATH : string = '.\';
HEADFILENAME : string = 'maphead';
MAPFILENAME : string = 'maptemp';
LEVELS : word = 10;
GAME_VERSION : real = 1.0;
type data_block = record
size : word;
data : pointer;
end;
level_type = record
map,
objects,
other : data_block;
width,
height : word;
name : string[16];
end;
grid = array[0..63,0..63] of word;
filltype = (solid,check);
doortype = (horiz,vert);
var levelmap,
objectmap : grid;
maps : array[1..60] of level_type;
show_objects,
show_floor : boolean;
mapgraph,
objgraph : array[0..511] of string[4];
mapnames,
objnames : array[0..511] of string[20];
themouse : resetrec;
mouseloc : locrec;
procedure waitforkey;
var key: char;
begin
repeat until keypressed;
key:= readkey;
if key=#0 then key:= readkey;
end;
procedure getkey(var key: char; var control: boolean);
begin
control:= false;
key:= readkey;
if key=#0 then
begin
control:= true;
key:= readkey;
end;
end;
procedure decorate(x,y,c: integer);
var i,j: integer;
begin
setfillstyle(1,c);
bar(x*7+MAP_X+2,y*7+MAP_Y+2,x*7+MAP_X+4,y*7+MAP_Y+4);
end;
procedure box(fill: filltype; x,y,c1,c2: integer; dec: boolean);
begin
if fill=solid then
setfillstyle(1,c1)
else
setfillstyle(9,c1);
bar(x*7+MAP_X,y*7+MAP_Y,x*7+6+MAP_X,y*7+6+MAP_Y);
if dec then decorate(x,y,c2);
end;
procedure outtext(x,y,color: integer; s: string);
begin
setcolor(color);
outtextxy(x*7+MAP_X,y*7+MAP_Y,s);
end;
function hex(x: word): string;
const digit : string[16] = '0123456789ABCDEF';
var temp : string[4];
i : integer;
begin
temp:= ' ';
for i:= 4 downto 1 do
begin
temp[i]:= digit[(x and $000f)+1];
x:= x div 16;
end;
hex:= temp;
end;
function hexbyte(x: byte): string;
const digit : string[16] = '0123456789ABCDEF';
var temp : string[4];
i : integer;
begin
temp:= ' ';
for i:= 2 downto 1 do
begin
temp[i]:= digit[(x and $000f)+1];
x:= x div 16;
end;
hexbyte:= temp;
end;
procedure doline(x,y,x2,y2: integer);
begin
line(x+MAP_X,y+MAP_Y,x2+MAP_X,y2+MAP_Y);
end;
procedure dobar(x,y,x2,y2: integer);
begin
bar(x+MAP_Y,y+MAP_Y,x2+MAP_X,y2+MAP_Y);
end;
procedure circle(x,y,c1,c2: integer);
const sprite : array[0..6,0..6] of byte =
((0,0,1,1,1,0,0),
(0,1,1,1,1,1,0),
(1,1,1,2,1,1,1),
(1,1,2,2,2,1,1),
(1,1,1,2,1,1,1),
(0,1,1,1,1,1,0),
(0,0,1,1,1,0,0));
var i,j,c: integer;
begin
for i:= 0 to 6 do
for j:= 0 to 6 do
begin
case sprite[i,j] of
0: c:=0;
1: c:=c1;
2: c:=c2;
end;
putpixel(x*7+MAP_X+i,y*7+MAP_Y+j,c);
end;
end;
procedure door(dtype: doortype; x,y,color: integer);
begin
case dtype of
vert: begin
setfillstyle(1,color);
dobar(x*7+2,y*7,x*7+4,y*7+6);
end;
horiz : begin
setfillstyle(1,color);
dobar(x*7,y*7+2,x*7+6,y*7+4);
end;
end;
end;
function hexnibble(c: char): byte;
begin
case c of
'0'..'9': hexnibble:= ord(c)-ord('0');
'a'..'f': hexnibble:= ord(c)-ord('a')+10;
'A'..'F': hexnibble:= ord(c)-ord('A')+10;
else hexnibble:= 0;
end;
end;
procedure output(x,y: integer; data: string);
var size : integer;
temp : string[4];
c1,c2 : byte;
begin
if data<>'0000' then
begin
temp:= data;
c1:= hexnibble(temp[1]);
c2:= hexnibble(temp[2]);
case temp[3] of
'0': outtext(x,y,c1,temp[4]);
'1': box(solid,x,y,c1,c2,false);
'2': box(check,x,y,c1,c2,false);
'3': box(solid,x,y,c1,c2,true);
'4': box(check,x,y,c1,c2,true);
'5': circle(x,y,c1,c2);
'6': door(horiz,x,y,c1);
'7': door(vert,x,y,c1);
'8': begin
setfillstyle(1,c1);
dobar(x*7,y*7,x*7+6,y*7+3);
setfillstyle(1,c2);
dobar(x*7,y*7+4,x*7+6,y*7+6);
end;
'9': putpixel(x*7+MAP_X+3,y*7+MAP_Y+3,c1);
'a': begin setfillstyle(1,c1); dobar(x*7+2,y*7+1,x*7+4,y*7+5); end;
'b': begin setfillstyle(1,c1); dobar(x*7+2,y*7+2,x*7+4,y*7+4); end;
'c': begin setfillstyle(1,c1); dobar(x*7+1,y*7+1,x*7+5,y*7+5); end;
'd': begin
setcolor(c1);
doline(x*7+1,y*7+1,x*7+5,y*7+5);
doline(x*7+5,y*7+1,x*7+1,y*7+5);
end;
'e': begin
setcolor(c1);
rectangle(x*7+MAP_X,y*7+MAP_Y,x*7+MAP_X+6,y*7+MAP_Y+6);
end;
'f': case c2 of
2: begin {east}
setcolor(c1);
doline(x*7,y*7+3,x*7+6,y*7+3);
doline(x*7+6,y*7+3,x*7+3,y*7);
doline(x*7+6,y*7+3,x*7+3,y*7+6);
end;
0: begin {north}
setcolor(c1);
doline(x*7+3,y*7+6,x*7+3,y*7);
doline(x*7+3,y*7,x*7,y*7+3);
doline(x*7+3,y*7,x*7+6,y*7+3);
end;
6: begin {west}
setcolor(c1);
doline(x*7+6,y*7+3,x*7,y*7+3);
doline(x*7,y*7+3,x*7+3,y*7);
doline(x*7,y*7+3,x*7+3,y*7+6);
end;
4: begin {south}
setcolor(c1);
doline(x*7+3,y*7,x*7+3,y*7+6);
doline(x*7+3,y*7+6,x*7,y*7+3);
doline(x*7+3,y*7+6,x*7+6,y*7+3);
end;
1: begin {northeast}
setcolor(c1);
doline(x*7,y*7+6,x*7+6,y*7);
doline(x*7+6,y*7,x*7+3,y*7);
doline(x*7+6,y*7,x*7+6,y*7+3);
end;
7: begin {northwest}
setcolor(c1);
doline(x*7+6,y*7+6,x*7,y*7);
doline(x*7,y*7,x*7+3,y*7);
doline(x*7,y*7,x*7,y*7+3);
end;
3: begin {southeast}
setcolor(c1);
doline(x*7,y*7,x*7+6,y*7+6);
doline(x*7+6,y*7+6,x*7+3,y*7+6);
doline(x*7+6,y*7+6,x*7+6,y*7+3);
end;
5: begin {southwest}
setcolor(c1);
doline(x*7+6,y*7,x*7,y*7+6);
doline(x*7,y*7+6,x*7+3,y*7+6);
doline(x*7,y*7+6,x*7,y*7+3);
end;
end;
end;
end;
end;
procedure display_map;
var i,j: integer;
begin
j:= 63;
i:= 0;
repeat
setfillstyle(1,0);
dobar(i*7,j*7,i*7+6,j*7+6);
if show_floor then
output(i,j,mapgraph[levelmap[i,j]])
else
if not (levelmap[i,j] in [$6a..$8f]) then
output(i,j,mapgraph[levelmap[i,j]]);
if show_objects then
output(i,j,objgraph[objectmap[i,j]]);
inc(i);
if i=64 then
begin
i:= 0;
dec(j);
end;
until (j<0) or keypressed;
end;
procedure read_levels;
var headfile,
mapfile : file;
s,o,
size : word;
idsig : string[4];
level : integer;
levelptr : longint;
tempstr : string[16];
map_pointer,
object_pointer,
other_pointer : longint;
begin
idsig:= ' ';
tempstr:= ' ';
assign(headfile,GAMEPATH+HEADFILENAME);
{$I-}
reset(headfile,1);
{$I+}
if ioresult<>0 then
begin
writeln('error opening ',HEADFILENAME);
halt(1);
end;
assign(mapfile,GAMEPATH+MAPFILENAME);
{$I-}
reset(mapfile,1);
{$I+}
if ioresult<>0 then
begin
writeln('error opening ',MAPFILENAME);
halt(1);
end;
for level:= 1 to LEVELS do
begin
seek(headfile,2+(level-1)*4);
blockread(headfile,levelptr,4);
seek(mapfile,levelptr);
with maps[level] do
begin
blockread(mapfile,map_pointer,4);
blockread(mapfile,object_pointer,4);
blockread(mapfile,other_pointer,4);
blockread(mapfile,map.size,2);
blockread(mapfile,objects.size,2);
blockread(mapfile,other.size,2);
blockread(mapfile,width,2);
blockread(mapfile,height,2);
name[0]:=#16;
blockread(mapfile,name[1],16);
if GAME_VERSION = 1.1 then
blockread(mapfile,idsig[1],4);
seek(mapfile,map_pointer);
getmem(map.data,map.size);
s:= seg(map.data^);
o:= ofs(map.data^);
blockread(mapfile,mem[s:o],map.size);
seek(mapfile,object_pointer);
getmem(objects.data,objects.size);
s:= seg(objects.data^);
o:= ofs(objects.data^);
blockread(mapfile,mem[s:o],objects.size);
seek(mapfile,other_pointer);
getmem(other.data,other.size);
s:= seg(other.data^);
o:= ofs(other.data^);
blockread(mapfile,mem[s:o],other.size);
if GAME_VERSION = 1.0 then
blockread(mapfile,idsig[1],4);
end;
end;
close(mapfile);
close(headfile);
end;
procedure write_levels;
var headfile,
mapfile : file;
abcd,
s,o,
size : word;
idsig : string[4];
level : integer;
levelptr : longint;
tempstr : string[16];
map_pointer,
object_pointer,
other_pointer : longint;
begin
abcd:= $abcd;
idsig:= '!ID!';
tempstr:= 'TED5v1.0';
assign(headfile,GAMEPATH+HEADFILENAME);
rewrite(headfile,1);
assign(mapfile,GAMEPATH+MAPFILENAME);
rewrite(mapfile,1);
blockwrite(headfile,abcd,2);
blockwrite(mapfile,tempstr[1],8);
levelptr:= 8;
for level:= 1 to LEVELS do
begin
with maps[level] do
begin
if GAME_VERSION = 1.1 then
begin
map_pointer:= levelptr;
s:= seg(map.data^);
o:= ofs(map.data^);
blockwrite(mapfile,mem[s:o],map.size);
inc(levelptr,map.size);
object_pointer:= levelptr;
s:= seg(objects.data^);
o:= ofs(objects.data^);
blockwrite(mapfile,mem[s:o],objects.size);
inc(levelptr,objects.size);
other_pointer:= levelptr;
s:= seg(other.data^);
o:= ofs(other.data^);
blockwrite(mapfile,mem[s:o],other.size);
inc(levelptr,other.size);
blockwrite(headfile,levelptr,4);
blockwrite(mapfile,map_pointer,4);
blockwrite(mapfile,object_pointer,4);
blockwrite(mapfile,other_pointer,4);
blockwrite(mapfile,map.size,2);
blockwrite(mapfile,objects.size,2);
blockwrite(mapfile,other.size,2);
blockwrite(mapfile,width,2);
blockwrite(mapfile,height,2);
name[0]:=#16;
blockwrite(mapfile,name[1],16);
inc(levelptr,38);
end
else
begin
blockwrite(headfile,levelptr,4);
map_pointer:= levelptr+38;
object_pointer:= map_pointer+map.size;
other_pointer:= object_pointer+objects.size;
blockwrite(mapfile,map_pointer,4);
blockwrite(mapfile,object_pointer,4);
blockwrite(mapfile,other_pointer,4);
blockwrite(mapfile,map.size,2);
blockwrite(mapfile,objects.size,2);
blockwrite(mapfile,other.size,2);
blockwrite(mapfile,width,2);
blockwrite(mapfile,height,2);
name[0]:=#16;
blockwrite(mapfile,name[1],16);
s:= seg(map.data^);
o:= ofs(map.data^);
blockwrite(mapfile,mem[s:o],map.size);
s:= seg(objects.data^);
o:= ofs(objects.data^);
blockwrite(mapfile,mem[s:o],objects.size);
s:= seg(other.data^);
o:= ofs(other.data^);
blockwrite(mapfile,mem[s:o],other.size);
inc(levelptr,map.size+objects.size+other.size+38);
end;
blockwrite(mapfile,idsig[1],4);
inc(levelptr,4);
end;
end;
close(mapfile);
close(headfile);
end;
procedure a7a8_expand(src: data_block; var dest: data_block);
var s,o,
s2,o2,
index,
index2,
size,
length,
data,
newsize : word;
goback1 : byte;
goback2 : word;
i : integer;
begin
s:=seg(src.data^);
o:=ofs(src.data^);
index:=0;
move(mem[s:o+index],dest.size,2); inc(index,2);
getmem(dest.data,dest.size);
s2:=seg(dest.data^);
o2:=ofs(dest.data^);
index2:=0;
repeat
move(mem[s:o+index],data,2); inc(index,2);
case hi(data) of
$a7: begin
length:=lo(data);
move(mem[s:o+index],goback1,1); inc(index,1);
move(mem[s2:o2+index2-goback1*2],mem[s2:o2+index2],length*2);
inc(index2,length*2);
end;
$a8: begin
length:=lo(data);
move(mem[s:o+index],goback2,2); inc(index,2);
move(mem[s2:o2+goback2*2],mem[s2:o2+index2],length*2);
inc(index2,length*2);
end;
else begin
move(data,mem[s2:o2+index2],2);
inc(index2,2);
end;
end;
until index=src.size;
end;
procedure expand(d: data_block; var g: grid);
var i,x,y : integer;
s,o,
data,
count : word;
temp : data_block;
begin
if GAME_VERSION = 1.1 then
a7a8_expand(d,temp)
else
temp:=d;
x:= 0;
y:= 0;
s:= seg(temp.data^);
o:= ofs(temp.data^);
inc(o,2);
while (y<64) do
begin
move(mem[s:o],data,2); inc(o,2);
if data=$abcd then
begin
move(mem[s:o],count,2); inc(o,2);
move(mem[s:o],data,2); inc(o,2);
for i:= 1 to count do
begin
g[x,y]:= data;
inc(x);
if x=64 then
begin
x:= 0;
inc(y);
end;
end;
end
else
begin
g[x,y]:= data;
inc(x);
if x=64 then
begin
x:= 0;
inc(y);
end;
end;
end;
if GAME_VERSION=1.1 then
freemem(temp.data,temp.size);
end;
procedure compress(g: grid; var d: data_block);
var temp : pointer;
size: word;
abcd,
s,o,
olddata,
data,
nextdata,
count : word;
x,y,i : integer;
temp2 : pointer;
begin
abcd:= $abcd;
x:= 0;
y:= 0;
getmem(temp,8194);
s:= seg(temp^);
o:= ofs(temp^);
data:= $2000;
move(data,mem[s:o],2);
size:= 2;
data:= g[0,0];
while (y<64) do
begin
count:= 1;
repeat
inc(x);
if x=64 then
begin
x:=0;
inc(y);
end;
if y<64 then
nextdata:= g[x,y];
inc(count);
until (nextdata<>data) or (y=64);
dec(count);
if count<3 then
begin
for i:= 1 to count do
begin
move(data,mem[s:o+size],2);
inc(size,2);
end;
end
else
begin
move(abcd,mem[s:o+size],2);
inc(size,2);
move(count,mem[s:o+size],2);
inc(size,2);
move(data,mem[s:o+size],2);
inc(size,2);
end;
data:= nextdata;
end;
getmem(temp2,size);
move(temp^,temp2^,size);
freemem(temp,8194);
if GAME_VERSION = 1.1 then
begin
getmem(temp,size+2);
s:= seg(temp^);
o:= ofs(temp^);
move(size,mem[s:o],2);
move(temp2^,mem[s:o+2],size);
d.data:=temp;
d.size:= size+2;
freemem(temp2,size);
end
else
begin
d.data:= temp2;
d.size:= size;
end;
end;
procedure clear_level(n: integer);
var x,y: integer;
begin
mhide;
for x:= 0 to 63 do
for y:= 0 to 63 do
begin
levelmap[x,y]:= $8c;
objectmap[x,y]:= 0;
end;
for x:= 0 to 63 do
begin
levelmap[x,0]:= 1;
levelmap[x,63]:= 1;
levelmap[0,x]:= 1;
levelmap[63,x]:= 1;
end;
display_map;
mshow;
end;
function str_to_hex(s: string): word;
var temp : word;
i : integer;
begin
temp:= 0;
for i:= 1 to length(s) do
begin
temp:= temp * 16;
case s[i] of
'0'..'9': temp:= temp + ord(s[i])-ord('0');
'a'..'f': temp:= temp + ord(s[i])-ord('a')+10;
'A'..'F': temp:= temp + ord(s[i])-ord('A')+10;
end;
end;
str_to_hex:= temp;
end;
procedure showlegend(which,start,n: integer);
var i,x,y: integer;
save: boolean;
begin
mhide;
save:= show_objects;
show_objects:= true;
setfillstyle(1,0);
bar(64*7+MAP_X+13,4,639-5,380-30);
x:= 66;
y:= 0;
for i:= start to start+n-1 do
begin
if which=0 then
begin
output(x,y,mapgraph[i]);
outtext(x+2,y,15,mapnames[i]);
end
else
begin
output(x,y,objgraph[i]);
outtext(x+2,y,15,objnames[i]);
end;
inc(y,2);
end;
show_objects:= save;
mshow;
end;
function inside(x1,y1,x2,y2,x,y: integer): boolean;
begin
inside:= (x>=x1) and (x<=x2) and
(y>=y1) and (y<=y2);
end;
procedure wait_for_mouserelease;
begin
repeat
mpos(mouseloc);
until mouseloc.buttonstatus=0;
end;
procedure bevel(x1,y1,x2,y2,c1,c2,c3: integer);
begin
setfillstyle(1,c1);
bar(x1,y1,x2,y2);
setcolor(c2);
line(x1,y1,x2,y1);
line(x1+1,y1+1,x2-1,y1+1);
line(x2,y1,x2,y2);
line(x2-1,y1,x2-1,y2-1);
setcolor(c3);
line(x1,y1+1,x1,y2);
line(x1+1,y1+2,x1+1,y2);
line(x1,y2,x2-1,y2);
line(x1+1,y2-1,x2-2,y2-1);
end;
function upper(s: string): string;
var i: integer;
begin
for i:=1 to length(s) do
if s[i] in ['a'..'z'] then
s[i]:=chr(ord(s[i])-ord('a')+ord('A'));
upper:=s;
end;
procedure initialize;
var i: integer;
infile: text;
path : pathstr;
dir : dirstr;
name : namestr;
ext : extstr;
filename : string;
hexstr : string[4];
graphstr : string[4];
name20 : string[20];
junk : char;
search : searchrec;
begin
filename:= GAMEPATH + HEADFILENAME + '.*';
writeln('searching for ',filename);
findfirst(filename,$ff,search);
if doserror<>0 then
begin
writeln('Error opening ',HEADFILENAME,' file.');
writeln;
writeln('Be sure that you installed MAPEDIT in the directory where');
writeln('Wolfenstein 3-D is installed.');
halt(0);
end
else
begin
filename:= search.name;
fsplit(filename,dir,name,ext);
HEADFILENAME:= upper(HEADFILENAME+ext);
if upper(ext)='.WL1' then
begin
LEVELS:=10;
GAME_VERSION:=1.0;
MAPFILENAME:='MAPTEMP'+ext;
filename:=GAMEPATH+'MAPTEMP'+ext;
findfirst(filename,$ff,search);
if doserror<>0 then
begin
GAME_VERSION:=1.1;
MAPFILENAME:='GAMEMAPS'+ext;
filename:=GAMEPATH+'GAMEMAPS'+ext;
findfirst(filename,$ff,search);
if doserror<>0 then
begin
writeln('Error opening GAMEMAPS or MAPTEMP file.');
halt(0);
end;
end;
end;
if (upper(ext)='.WL3') or (upper(ext)='.WL6') then
begin
GAME_VERSION:=1.1;
if upper(ext)='.WL3' then
LEVELS:= 30
else
LEVELS:= 60;
MAPFILENAME:='GAMEMAPS'+ext;
filename:=GAMEPATH+'GAMEMAPS'+ext;
findfirst(filename,$ff,search);
if doserror<>0 then
begin
writeln('Error opening GAMEMAPS file.');
halt(0);
end;
end;
end;
for i:= 0 to 511 do
begin
mapnames[i]:= 'unknown '+hex(i);
objnames[i]:= 'unknown '+hex(i);
mapgraph[i]:= 'f010';
objgraph[i]:= 'f010';
end;
assign(infile,'mapdata.def');
reset(infile);
while not eof(infile) do
begin
readln(infile,hexstr,junk,graphstr,junk,name20);
mapnames[str_to_hex(hexstr)]:= name20;
mapgraph[str_to_hex(hexstr)]:= graphstr;
end;
close(infile);
assign(infile,'objdata.def');
reset(infile);
while not eof(infile) do
begin
readln(infile,hexstr,junk,graphstr,junk,name20);
objnames[str_to_hex(hexstr)]:= name20;
objgraph[str_to_hex(hexstr)]:= graphstr;
end;
close(infile);
end;
var gd,gm,
i,j,x,y : integer;
infile : text;
level : word;
oldx,oldy : integer;
done : boolean;
outstr,
tempstr : string;
legendpos : integer;
legendtype: integer;
newj : integer;
currenttype,
currentval: integer;
oldj,oldi : integer;
key : char;
control : boolean;
begin
clrscr;
initialize;
directvideo:=false;
read_levels;
gd:= vga;
gm:= vgahi;
initgraph(gd,gm,'');
settextstyle(0,0,1);
mreset(themouse);
show_objects:= true;
show_floor:= false;
x:= port[$3da];
port[$3c0]:= 0;
setfillstyle(1,7);
bar(0,0,64*7+MAP_X+4,64*7+MAP_Y+4);
bar(64*7+MAP_X+9,0,639,380);
setfillstyle(1,0);
bar(2,2,64*7+MAP_X+2,64*7+MAP_Y+2);
bar(64*7+MAP_X+11,2,637,380-28);
bar(64*7+MAP_X+11,380-25,637,378);
setcolor(15);
outtextxy(64*7+MAP_X+15,380-16,' MAP OBJ UP DOWN');
setfillstyle(1,7);
bar(64*7+MAP_X+11+043,380-25,64*7+MAP_X+11+044,378);
bar(64*7+MAP_X+11+083,380-25,64*7+MAP_X+11+084,378);
bar(64*7+MAP_X+11+113,380-25,64*7+MAP_X+11+114,378);
legendpos:= 0;
legendtype:= 0;
currenttype:= 0;
currentval:= 1;
setfillstyle(1,0);
bar(66*7+MAP_X,60*7+MAP_Y,637,61*7+MAP_Y);
if currenttype=0 then
begin
output(66,60,mapgraph[currentval]);
outtext(67,60,15,' - '+mapnames[currentval]);
end
else
begin
output(66,60,objgraph[currentval]);
outtext(67,60,15,' - '+objnames[currentval]);
end;
showlegend(legendtype,legendpos,25);
x:= port[$3da];
port[$3c0]:= 32;
mshow;
level:=1;
done:= false;
repeat
mhide;
setfillstyle(1,0);
bar(5,TEXTLOC,64*7-1+MAP_X,477);
setcolor(15);
outtextxy(5,TEXTLOC,maps[level].name);
expand(maps[level].map,levelmap);
expand(maps[level].objects,objectmap);
display_map;
mshow;
oldx:= 0;
oldy:= 0;
key:= #0;
repeat
repeat
mpos(mouseloc);
x:= mouseloc.column;
y:= mouseloc.row;
until (oldx<>x) or (oldy<>y) or keypressed or (mouseloc.buttonstatus<>0);
oldx:= x;
oldy:= y;
if (mouseloc.buttonstatus<>0) then
begin
if inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y) then
begin
mhide;
repeat
i:= (x - MAP_X) div 7;
j:= (y - MAP_Y) div 7;
if currenttype=0 then
levelmap[i,j]:= currentval
else
objectmap[i,j]:= currentval;
setfillstyle(1,0);
dobar(i*7,j*7,i*7+6,j*7+6);
if show_floor then
output(i,j,mapgraph[levelmap[i,j]])
else
if not (levelmap[i,j] in [$6a..$8f]) then
output(i,j,mapgraph[levelmap[i,j]]);
if show_objects then
output(i,j,objgraph[objectmap[i,j]]);
mpos(mouseloc);
x:= mouseloc.column;
y:= mouseloc.row;
until (not inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y)) or
(mouseloc.buttonstatus=0);
mshow;
end;
if inside(464,355,506,378,x,y) then
begin
wait_for_mouserelease;
legendpos:= 0;
legendtype:= 0;
showlegend(legendtype,legendpos,25);
end;
if inside(509,355,546,378,x,y) then
begin
wait_for_mouserelease;
legendpos:= 0;
legendtype:= 1;
showlegend(legendtype,legendpos,25);
end;
if inside(549,355,576,378,x,y) then
begin
wait_for_mouserelease;
dec(legendpos,25);
if legendpos<0 then legendpos:= 0;
showlegend(legendtype,legendpos,25);
end;
if inside(579,355,637,378,x,y) then
begin
wait_for_mouserelease;
inc(legendpos,25);
if (legendpos+25)>255 then legendpos:= 255-25;
showlegend(legendtype,legendpos,25);
end;
end;
if inside(464,2,637,350,x,y) then
begin
mhide;
j:= (y-2) div 14;
setcolor(15);
rectangle(465,j*14+2+1,636,j*14+2+12);
repeat
mpos(mouseloc);
newj:= (mouseloc.row-2) div 14;
if mouseloc.buttonstatus<>0 then
begin
currenttype:= legendtype;
currentval:= legendpos+j;
setfillstyle(1,0);
bar(66*7+MAP_X,60*7+MAP_Y,637,61*7+MAP_Y);
if currenttype=0 then
begin
output(66,60,mapgraph[currentval]);
outtext(67,60,15,' - '+mapnames[currentval]);
end
else
begin
output(66,60,objgraph[currentval]);
outtext(67,60,15,' - '+objnames[currentval]);
end;
end;
until (newj<>j) or (mouseloc.column<464) or keypressed;
setcolor(0);
rectangle(465,j*14+2+1,636,j*14+2+12);
mshow;
end;
if inside(MAP_X,MAP_Y,64*7+MAP_X-1,64*7+MAP_Y-1,x,y) then
begin
i:= (x - MAP_X) div 7;
j:= (y - MAP_Y) div 7;
if (oldj<>j) or (oldi<>i) then
begin
outstr:= '(';
str(i:2,tempstr);
outstr:= outstr+tempstr+',';
str(j:2,tempstr);
outstr:= outstr+tempstr+') map: '+hex(levelmap[i,j]);
outstr:= outstr+' - '+mapnames[levelmap[i,j]];
setfillstyle(1,0);
setcolor(15);
bar(100,TEXTLOC,64*7+MAP_X-1,479);
outtextxy(100,TEXTLOC,outstr);
outstr:= ' object: '+hex(objectmap[i,j])+' - '+objnames[objectmap[i,j]];
outtextxy(100,TEXTLOC+10,outstr);
oldj:= j;
oldi:= i;
end;
end
else
begin
mhide;
setfillstyle(1,0);
bar(100,TEXTLOC,360,479);
mshow;
end;
if keypressed then
begin
control:= false;
key:= readkey;
if key=#0 then
begin
control:= true;
key:= readkey;
end;
if control then
case key of
'H':
begin
freemem(maps[level].map.data,maps[level].map.size);
freemem(maps[level].objects.data,maps[level].objects.size);
compress(levelmap,maps[level].map);
compress(objectmap,maps[level].objects);
inc(level);
end;
'P':
begin
freemem(maps[level].map.data,maps[level].map.size);
freemem(maps[level].objects.data,maps[level].objects.size);
compress(levelmap,maps[level].map);
compress(objectmap,maps[level].objects);
dec(level);
end;
end
else
case key of
'q','Q':
begin
done:= true;
freemem(maps[level].map.data,maps[level].map.size);
freemem(maps[level].objects.data,maps[level].objects.size);
compress(levelmap,maps[level].map);
compress(objectmap,maps[level].objects);
end;
'c','C': clear_level(level);
'o','O': begin
mhide;
show_objects:= not show_objects;
display_map;
mshow;
end;
'f','F': begin
mhide;
show_floor:= not show_floor;
display_map;
if legendtype=0 then
showlegend(legendtype,legendpos,25);
mshow;
end;
end;
end;
until done or (key in ['P','H']);
if level=0 then level:=LEVELS;
if level=(LEVELS+1) then level:=1;
until done;
setfillstyle(1,0);
bar(0,TEXTLOC,639,479);
setcolor(15);
outtextxy(0,TEXTLOC,' Save the current levels to disk? (Y/N) ');
repeat
repeat until keypressed;
key:= readkey;
if key=#0 then
begin
key:= readkey;
key:= #0;
end;
until key in ['y','Y','n','N'];
if key in ['y','Y'] then write_levels;
textmode(co80);
writeln('MapEdit 4.1 Copyright (c) 1992 Bill Kirby');
writeln;
writeln('This program is intended to be for your personal use only.');
writeln('Distribution of any modified maps may be construed as a ');
writeln('copyright violation by Apogee/ID.');
writeln;
end.